Chord Similarity analysis table

chord similarity
Using a vector space to analyse similarity between chords in an interactive table
Author

Matt Crump

Published

January 22, 2024

piano chord similarity analysis. cartoon. colorful. musical. science.

This is a quick post with some tools for looking at chord similarity.

I took all of the chords on this music theory page, and represented them in a chord vector space using one-hot codes.

Each chord is represented as a vector with 12 features, corresponding to each of the 12 possible notes. If a note is in a chord, then the note feature get’s a 1 in the vector. All other features are set to 0.

Here’s a few examples of what the vectors look like.

item C Db D Eb E F Gb G Ab A Bb B
C 1 0 0 0 0 0 0 0 0 0 0 0
C major scale 1 0 1 0 1 1 0 1 0 1 0 1
C major triad 1 0 0 0 1 0 0 1 0 0 0 0
C minor triad 1 0 0 1 0 0 0 1 0 0 0 0
C6 1 0 0 0 1 0 0 1 0 1 0 0

I created vectors for 47 chords across all keys. This results in a matrix with 564 rows (for each chord vector) and 12 columns for each note feature.

Next, I used the vector cosine to compute the similarity between each chord and every other chords. That results in a 564x564 chord-similarity matrix.

In the matrix, similarity ranges from 0 (no similarity) to 1 (perfect similarity). The similarity function basically tracks how many overlapping features there are between two chords. If each chord has zero shared notes, then similarity will be 0. As a chord increases in the number of shared notes, then similarity increases.

If I have extra time I may play around with some additional ways to visualize this matrix. For now, I’m using the datatable library to load the matrix into this webpage. It’s a bit clunky and very large.

The table should scroll left and right. The columns can be sorted ascending or descending by clicking the little arrows beside a column name. Sorting from the largest value to the smallest value will re-arrange the row-names on the left side. This produces an ordered list of chords from most to least similar to the column name that was clicked.